package jmine.tec.report.api.table;

import java.util.Iterator;
import java.util.List;

import jmine.tec.report.api.ReportElement;

/**
 * Interface utilizada para definir uma tabela de um relatório
 * 
 * @param <V> report table
 */
public interface ReportTable<V> extends ReportElement {

    String RENDERER = "tableReport";

    /**
     * Adiciona uma coluna à linha
     * 
     * @param column column
     */
    void addColumn(ReportColumn<V> column);

    /**
     * Define o iterável sobre registros da tabela.
     * 
     * @param records records
     */
    void setRecords(Iterable<V> records);

    /**
     * Adiciona uma célula de tabela que deve ser mostrada no cabeçalho da tabela.
     * 
     * @param cell cell
     */
    void addTableHeader(ReportCell cell);

    /**
     * Adiciona um grupo de registros
     * 
     * @param group group
     */
    void addGroup(ReportTableGroup<V> group);

    /**
     * Retorna as definições de colunas
     * 
     * @return lista de definições de colunas
     */
    List<ReportColumn<V>> getColumns();

    /**
     * Cria um iterador sobre as linhas da tabela.
     * 
     * @return {@link Iterator} de ReportRow
     */
    Iterator<ReportRow<V>> createRowIterator();

    /**
     * Retorna a linha da tabela que representa o cabeçalho.
     * 
     * @return ReportRow
     */
    ReportRow createContentHeader();

    /**
     * Retorna a linha da tabela que representa o rodapé
     * 
     * @return ReportRow
     */
    ReportRow createContentFooter();

    /**
     * Lista de células que devem ser mostradas como cabeçalho da tabela.
     * 
     * @return list de ReportCell
     */
    List<ReportCell> getTableHeader();

    /**
     * Se a tabela deve ter cabeçalho.
     * 
     * @return boolean
     */
    boolean hasContentHeader();

    /**
     * Se a tabela deve ter rodapé
     * 
     * @return boolean
     */
    boolean hasContentFooter();

    /**
     * Devolve o report table group caso este tenha implemetado
     * 
     * @return {@link ReportTableGroup}
     */
    List<ReportTableGroup<V>> getTableGroup();

}
